/*
 * ReclamoHelper.java
 *
 * Created on 12 de marzo de 2007, 05:41 PM
 *
 * To change this template, choose Tools | Options and locate the template under
 * the Source Creation and Management node. Right-click the template and choose
 * Open. You can then make changes to the template in the Source Editor.
 */

package com.src.computec.radar.reclamos.reclamo.helper;

import com.src.computec.radar.base.dao.exception.DAOException;
import com.src.computec.radar.reclamos.base.constantes.ConstantesGenerales;
import com.src.computec.radar.reclamos.base.helper.BaseHelper;
import com.src.computec.radar.reclamos.reclamo.dao.BaseReclamoDAO;
import com.src.computec.radar.reclamos.reclamo.dto.BusquedaDto;
import com.src.computec.radar.reclamos.reclamo.dto.EnvioRecomendadoDto;
import com.src.computec.radar.reclamos.reclamo.dto.ReclamoDto;
import com.src.computec.radar.reclamos.reclamo.dto.ReclamoSeguimientoDto;
import com.src.computec.radar.reclamos.reclamo.dto.RespuestaWSDto;
import com.src.computec.radar.reclamos.reclamo.exception.ReclamoException;
import com.src.computec.radar.reclamos.thread.FileThread;
import com.src.computec.radar.services.utilities.consultas.exception.ConsultasException;
import com.src.computec.radar.services.utilities.consultas.helper.ConsultasHelper;
import com.src.computec.radar.services.utilities.dto.DocumentoDto;
import com.src.log4j.logger.custom.XLogger;
import java.math.BigInteger;
import java.util.Date;
import java.util.List;

/**
 *
 * @author aocampo
 */
public class ReclamoHelper extends BaseHelper {
    
    private static XLogger xLogger;
    
    /** Creates a new instance of ReclamoHelper */
    public ReclamoHelper() {
        this.xLogger = (XLogger) XLogger.getLogger(this.getClass().getName());
    }
    
    public String insertReclamo(ReclamoDto dto) throws ReclamoException {
        BaseReclamoDAO dao = (BaseReclamoDAO) this.getFactoryDAO().getReclamoDAO();
        try {
            if (!dao.isExistReclamoAbierto(dto)) {
                return dao.insertReclamo(dto);
            }
            else {
                return dao.updateReclamo(dto);
            }
        }
        catch (DAOException e) {
            throw new ReclamoException("ReclamoHelper:insertReclamo: " + e.toString());
        }
    }
    
    private boolean isNumber(String token) {
        try {
            BigInteger bigInteger = new BigInteger(token);
            return true;
        }
        catch(NumberFormatException nfe) {
            return false;
        }
    }
    
    /**
     * metodo para la insersion de reclamos a traves de web service
     */
    public RespuestaWSDto insertReclamoWebService(DocumentoDto documentoDto, ReclamoDto reclamoDto) {
        BaseReclamoDAO dao = (BaseReclamoDAO) this.getFactoryDAO().getReclamoDAO();
        RespuestaWSDto respuestaWSDto = new RespuestaWSDto();
        respuestaWSDto.setClaveCliente(reclamoDto.getClaveCliente());
        ConsultasHelper consultasHelper = new ConsultasHelper();
        try {
            String codigoBarras = documentoDto.getCodigoBarras();
            reclamoDto.setFechaGeneracion(new Date());
            reclamoDto.setCodigoEstado(ConstantesGenerales.CODIGO_ESTADO_RECLAMO_POR_ASIGNAR);
            reclamoDto.setCodigoInternoCliente(documentoDto.getCodigoInternoCliente());
            if (codigoBarras != null && !codigoBarras.equals("") && this.isNumber(codigoBarras)) {
                if (consultasHelper.isEnvioExist(codigoBarras)) {
                    reclamoDto.setCodigoBarras(codigoBarras);
                    respuestaWSDto.setCodigoBarras(codigoBarras);
                    if (!dao.isExistReclamoAbierto(reclamoDto)) {
                        respuestaWSDto.setCodigoReclamo(dao.insertReclamo(reclamoDto));
                        respuestaWSDto.setCodigoEstadoWS(ConstantesGenerales.CODIGO_ESTADO_WS_EXISTOSO);
                    }
                    else {
                        respuestaWSDto.setCodigoReclamo(dao.updateReclamo(reclamoDto));
                        respuestaWSDto.setCodigoEstadoWS(ConstantesGenerales.CODIGO_ESTADO_WS_EXISTOSO);
                    }
                }
                else {
                    respuestaWSDto.setCodigoEstadoWS(ConstantesGenerales.CODIGO_ESTADO_WS_NO_EXISTE_CB);
                }
            }
            else {
                documentoDto = consultasHelper.getDocumentoByMinimunParameters(documentoDto);
                if (documentoDto != null) {
                    reclamoDto.setCodigoBarras(documentoDto.getCodigoBarras());
                    respuestaWSDto.setCodigoBarras(documentoDto.getCodigoBarras());
                    if (!dao.isExistReclamoAbierto(reclamoDto)) {
                        respuestaWSDto.setCodigoReclamo(dao.insertReclamo(reclamoDto));
                        respuestaWSDto.setCodigoEstadoWS(ConstantesGenerales.CODIGO_ESTADO_WS_EXISTOSO);
                    }
                    else {
                        respuestaWSDto.setCodigoReclamo(dao.updateReclamo(reclamoDto));
                        respuestaWSDto.setCodigoEstadoWS(ConstantesGenerales.CODIGO_ESTADO_WS_EXISTOSO);
                    }
                }
                else {
                    respuestaWSDto.setCodigoEstadoWS(ConstantesGenerales.CODIGO_ESTADO_WS_NO_EXISTE_CB);
                }
            }
        }
        catch (ConsultasException e) {
            respuestaWSDto.setCodigoEstadoWS(ConstantesGenerales.CODIGO_ESTADO_WS_FALLA_TECNICA);
            xLogger.error("ReclamoHelper:insertReclamoWebService:", e);
        }
        catch (DAOException e) {
            respuestaWSDto.setCodigoEstadoWS(ConstantesGenerales.CODIGO_ESTADO_WS_FALLA_TECNICA);
            xLogger.error("ReclamoHelper:insertReclamoWebService:", e);
        }
        catch (Exception e) {
            respuestaWSDto.setCodigoEstadoWS(ConstantesGenerales.CODIGO_ESTADO_WS_FALLA_TECNICA);
            xLogger.error("ReclamoHelper:insertReclamoWebService:", e);
        }
        xLogger.info("ReclamoHelper:insertReclamoWebService:respuestaWSDto:" + respuestaWSDto.toString());
        return respuestaWSDto;
    }
    
    public int calculateAlarmasReclamos() throws ReclamoException {
        BaseReclamoDAO dao = (BaseReclamoDAO) this.getFactoryDAO().getReclamoDAO();
        try {
            return dao.calculateAlarmasReclamos();
        }
        catch (DAOException e) {
            throw new ReclamoException("ReclamoHelper:calculateAlarmasReclamos: " + e.toString());
        }
    }
    
    public int calculateDuracionMovimientosMasivo() throws ReclamoException {
        BaseReclamoDAO dao = (BaseReclamoDAO) this.getFactoryDAO().getReclamoDAO();
        try {
            return dao.calculateDuracionMovimientosMasivo();
        }
        catch (DAOException e) {
            throw new ReclamoException("ReclamoHelper:calculateDuracionMovimientosMasivo: " + e.toString());
        }
    }
    
    public ReclamoDto getReclamoByPrimaryKey(String codigoReclamo) throws ReclamoException {
        BaseReclamoDAO dao = (BaseReclamoDAO) this.getFactoryDAO().getReclamoDAO();
        try {
            return dao.getReclamoByPrimaryKey(codigoReclamo);
        }
        catch (DAOException e) {
            throw new ReclamoException("ReclamoHelper:getReclamoByPrimaryKey: " + e.toString());
        }
    }
    
    public List getReclamosByBusqueda(BusquedaDto dto) throws ReclamoException {
        BaseReclamoDAO dao = (BaseReclamoDAO) this.getFactoryDAO().getReclamoDAO();
        try {
            return dao.getReclamosByBusqueda(dto);
        }
        catch (DAOException e) {
            throw new ReclamoException("ReclamoHelper:getReclamosByBusqueda: " + e.toString());
        }
    }
    
    public List getHistoricoReclamacion(ReclamoDto dto) throws ReclamoException {
        BaseReclamoDAO dao = (BaseReclamoDAO) this.getFactoryDAO().getReclamoDAO();
        try {
            return dao.getHistoricoReclamacion(dto);
        }
        catch (DAOException e) {
            throw new ReclamoException("ReclamoHelper:getHistoricoReclamacion: " + e.toString());
        }
    }
    
    public List getHistoricoEnvios(ReclamoDto dto) throws ReclamoException {
        BaseReclamoDAO dao = (BaseReclamoDAO) this.getFactoryDAO().getReclamoDAO();
        try {
            return dao.getHistoricoEnvios(dto);
        }
        catch (DAOException e) {
            throw new ReclamoException("ReclamoHelper:getHistoricoEnvios: " + e.toString());
        }
    }
    
    public List getConsecutivosEnvio(ReclamoDto dto) throws ReclamoException {
        BaseReclamoDAO dao = (BaseReclamoDAO) this.getFactoryDAO().getReclamoDAO();
        try {
            return dao.getConsecutivosEnvio(dto);
        }
        catch (DAOException e) {
            throw new ReclamoException("ReclamoHelper:getConsecutivosEnvio: " + e.toString());
        }
    }
    
    public List getSeguimientosByReclamo(ReclamoDto dto) throws ReclamoException {
        BaseReclamoDAO dao = (BaseReclamoDAO) this.getFactoryDAO().getReclamoDAO();
        try {
            return dao.getSeguimientosByReclamo(dto);
        }
        catch (DAOException e) {
            throw new ReclamoException("ReclamoHelper:getSeguimientosByReclamo: " + e.toString());
        }
    }
    
    public void insertReclamoSeguimiento(ReclamoSeguimientoDto dto) throws ReclamoException {
        BaseReclamoDAO dao = (BaseReclamoDAO) this.getFactoryDAO().getReclamoDAO();
        try {
            dao.insertReclamoSeguimiento(dto);
        }
        catch (DAOException e) {
            throw new ReclamoException("ReclamoHelper:insertReclamoSeguimiento: " + e.toString());
        }
    }
    
    public List getMovimientosByReclamo(ReclamoDto dto) throws ReclamoException {
        BaseReclamoDAO dao = (BaseReclamoDAO) this.getFactoryDAO().getReclamoDAO();
        try {
            return dao.getMovimientosByReclamo(dto);
        }
        catch (DAOException e) {
            throw new ReclamoException("ReclamoHelper:getMovimientosByReclamo: " + e.toString());
        }
    }
    
    public void processAction(ReclamoDto dto) throws ReclamoException {
        BaseReclamoDAO dao = (BaseReclamoDAO) this.getFactoryDAO().getReclamoDAO();
        try {
            dao.processAction(dto);
        }
        catch (DAOException e) {
            throw new ReclamoException("ReclamoHelper:processAction: " + e.toString());
        }
    }
    
    public void processActionCerrarReclamo(ReclamoDto dto) throws ReclamoException {
        BaseReclamoDAO dao = (BaseReclamoDAO) this.getFactoryDAO().getReclamoDAO();
        try {
            dao.processActionCerrarReclamo(dto);
        }
        catch (DAOException e) {
            throw new ReclamoException("ReclamoHelper:processActionCerrarReclamo: " + e.toString());
        }
    }
    
    public boolean insertEnvioRecomendado(EnvioRecomendadoDto dto) throws ReclamoException {
        BaseReclamoDAO dao = (BaseReclamoDAO) this.getFactoryDAO().getReclamoDAO();
        try {
            return dao.insertEnvioRecomendado(dto);
        }
        catch (DAOException e) {
            throw new ReclamoException("ReclamoHelper:insertEnvioRecomendado: " + e.toString());
        }
    }
    
    public void updateReclamosResponsable(List listCodigosReclamos, String uidResponsable, String uidMovimiento) throws ReclamoException {
        BaseReclamoDAO dao = (BaseReclamoDAO) this.getFactoryDAO().getReclamoDAO();
        try {
            dao.updateReclamosResponsable(listCodigosReclamos, uidResponsable, uidMovimiento);
        }
        catch (DAOException e) {
            throw new ReclamoException("ReclamoHelper:updateReclamosResponsable: " + e.toString());
        }
    }
    
    public void exportBitacora(List listReclamos, String ldapUser, int rol) throws ReclamoException {
        String fileName = ConstantesGenerales.RANDOM_STRING_UTILS.randomAlphanumeric(20) + ConstantesGenerales.FILE_EXTENSION;
        Thread thread = new Thread(new FileThread(FileThread.FILE_BITACORA_RECLAMOS, fileName, listReclamos, rol));
        thread.start();
        BaseReclamoDAO dao = (BaseReclamoDAO) this.getFactoryDAO().getReclamoDAO();
        try {
            dao.insertMensajeAlerta(fileName, ldapUser, listReclamos.size());
        }
        catch (DAOException e) {
            throw new ReclamoException("ReclamoHelper:exportBitacora: " + e.toString());
        }
    }
    
    public List getResponsablesReclamo() throws ReclamoException {
        BaseReclamoDAO dao = (BaseReclamoDAO) this.getFactoryDAO().getReclamoDAO();
        try {
            return dao.getResponsablesReclamo();
        }
        catch (DAOException e) {
            throw new ReclamoException("ReclamoHelper:getResponsablesReclamo: " + e.toString());
        }
    }
    
    public List getEventosReclamo() throws ReclamoException {
        BaseReclamoDAO dao = (BaseReclamoDAO) this.getFactoryDAO().getReclamoDAO();
        try {
            return dao.getEventosReclamo();
        }
        catch (DAOException e) {
            throw new ReclamoException("ReclamoHelper:getEventosReclamo: " + e.toString());
        }
    }
    
    public List getRespuestasReclamoByCodigoBarras(String codigoBarras) throws ReclamoException {
        BaseReclamoDAO dao = (BaseReclamoDAO) this.getFactoryDAO().getReclamoDAO();
        try {
            return dao.getRespuestasReclamoByCodigoBarras(codigoBarras);
        }
        catch (DAOException e) {
            throw new ReclamoException("ReclamoHelper:getRespuestasReclamoByCodigoBarras: " + e.toString());
        }
    }
    
    public int updateRespuestasReclamos() throws ReclamoException {
        BaseReclamoDAO dao = (BaseReclamoDAO) this.getFactoryDAO().getReclamoDAO();
        try {
            return dao.updateRespuestasReclamos();
        }
        catch (DAOException e) {
            throw new ReclamoException("ReclamoHelper:updateRespuestasReclamos: " + e.toString());
        }
    }
}